package xman.mssh.spring.proxy.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/*-
 * CGLib采用非常底层的字节码技术
 * 
 * 为一个类创建子类，并在子类中采用方法拦截的技术拦截所有父类方法的调用，并顺势织入横切逻辑
 */
public class CglibProxy implements MethodInterceptor {
    private Enhancer enhancer = new Enhancer();
    
    /**
     * 为一个类动态创建代理对象，该代理对象通过扩展代理类clazz创建代理对象
     * @param clazz ： 被代理的类
     * @return
     */
    public Object getProxy(Class<?> clazz) {
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();
    }
    
    /*-
     * obj表示目标类的实例
     * method为目标类方法的反射对象 
     * args为方法的动态入参 
     * proxy为代理类实例
     */
    public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        Object ret = proxy.invokeSuper(object, args);
        return ret;
    }
    
}
